/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.apli.haiam.listener;

import com.apli.controladores.AplinfoFactoryBean;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apli.haiam.ejb.entidades.AdmDatosGlobales;
import org.apli.haiam.ejb.entidades.AdmMenu;
import org.apli.haiam.ejb.entidades.AdmSistema;
import org.apli.haiam.ejb.interfaces.AdministradorHaiam;
import org.apli.haiam.ejb.interfaces.AdministradorLoginHaiam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase que inicializa las variables globales de applicación y de sesión en el
 * aplicativo. <p> Los métodos de esta clase se ejecutan al iniciar y detener la
 * aplicación web. 
 *
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
public class AppContextListener implements ServletContextListener {
    
    private static final Logger log = LoggerFactory.getLogger(AppContextListener.class);
//    @EJB(beanName = "AdministradorBean")
    protected AdministradorHaiam admin;
    private AdministradorLoginHaiam adminLogin;
    private static String _SIS;
    private final static String CLAVE_SISTEMA = "HOSP";

    /**
     * Método invocado al momneto de instanciar la aplicación, utilizado para
     * cargar datos globales de la aplicación.
     *
     * @param arg0 el evento
     */
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        try {
            _SIS = arg0.getServletContext().getContextPath();

            cargarEjb();
            ServletContext servletContext = arg0.getServletContext();

            //Esta linea es particular para cada sistema
            AdmSistema sistema = (AdmSistema) admin.buscar(AdmSistema.class, "clave", CLAVE_SISTEMA);

            List<AdmDatosGlobales> datos = admin.listar(AdmDatosGlobales.class, "estado", 1, "admSistema", sistema);
            Map<String, AdmDatosGlobales> datosGlobalesMap = new HashMap<>();
            for (AdmDatosGlobales obj : datos) {
                datosGlobalesMap.put(obj.getClave(), obj);
            }
            //Carga los datos globales asociados al sistema 0
            datos = admin.listar(AdmDatosGlobales.class, "estado", 1, "admSistema", admin.buscar(AdmSistema.class, (short) 0));
            for (AdmDatosGlobales obj : datos) {
                datosGlobalesMap.put(obj.getClave(), obj);
            }

            // carga los datos del sistema principal
            log.info(_SIS + ": ----------------------------");
            List<AdmMenu> menu;
            Date fecha = new Date();
            try {
                fecha = adminLogin.getFechaDb();
            } catch (Exception e) {
            }
            try {
                AdmSistema sistemaPrincipal = (AdmSistema) admin.buscar(AdmSistema.class, "clave", "HAIAM");
                servletContext.setAttribute("sistemaPrincipal", sistemaPrincipal);
                menu = adminLogin.getMenuBase(sistemaPrincipal);
                log.info(_SIS + ": contextInitialized(..) SISTEMA GLOBAL UTILIZADO {}", sistemaPrincipal);
            } catch (Exception e) {
                menu = adminLogin.getMenuBase(sistema);
                log.info(_SIS + ": contextInitialized(..) No existe sistema global ..." + e);
            }
            log.info(_SIS + ": ----------------------------");
            //--
            log.info(_SIS + ": contextInitialized(..) Datos globales cargadas en el sistema {}...", sistema.getNombre());
            for (AdmDatosGlobales obj : datos) {
                log.info(_SIS + " " + obj.getClave() + ": " + obj.getValor());
            }
            servletContext.setAttribute("datosGlobalesMap", datosGlobalesMap);
            servletContext.setAttribute("sistema", sistema);
            servletContext.setAttribute("menu", menu);
            servletContext.setAttribute("fecha", fecha);
            log.info(_SIS + ": contextInitialized(..) --> {} INICIADO CORRECTAMENTE..", sistema.getNombre());
        } catch (Exception e) {
            log.error(_SIS + ": contextInitialized(..) EL SISTEMA {} EXISTE ERRORES AL INICIAR EL SISTEMA..");
            log.error(_SIS + ": contextInitialized(...) ERROR: " + e);
        }
    }

    /**
     * Método que se ejecuta cuando la aplicación se detiene.
     *
     * @param arg0 el evento
     */
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
    }

    /**
     * Obtiene el objeto remoto.
     */
    protected void cargarEjb() {
        if (admin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                admin = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error(_SIS + " cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }
        }
        if (adminLogin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorLoginBeanHaiam";
                adminLogin = (AdministradorLoginHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error(_SIS + " cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }
        }
    }

    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }
}

